﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Sauces.Bussinees.Entities.Caja;
using Sauces.Repository.Caja.Service;

namespace Sauces.Repository.Caja
{
   public  class BoletaRepository:MasterRepository,IBoletaRepository
    {
        public List<Boleta> getAllBoleta()
        {
            var query = from p in Context.Boleta.Include("Cliente")
                        select p;

            return query.ToList();
        }

        

        public Boleta getAllBoletaByNumero(int numero)
        {
            throw new NotImplementedException();
        }

        public Boleta getFromBoletaById(int id)
        {
            var query = from p in Context.Boleta.Include("DetalleBoleta.Producto").Include("Cliente")
                        where p.Id.Equals(id)
                        select p;

            return query.SingleOrDefault();
        }

        public void addBoleta(Boleta boleta)
        {
            Context.Entry(boleta.Cliente).State = System.Data.EntityState.Unchanged;

            foreach (var detalle in boleta.DetalleBoleta)
            {
                Context.Entry(detalle.Producto).State = System.Data.EntityState.Unchanged;

            }
            Context.Boleta.Add(boleta);
            Context.SaveChanges();
        }

        public void upDateBoleta(Boleta boleta)
        {
            var boletaDB = getFromBoletaById(boleta.Id);

            boletaDB.Fecha = boleta.Fecha;
            boletaDB.Total = boleta.Total;



            if (boletaDB.IdCliente != boleta.IdCliente)
            {
                boletaDB.IdCliente = boleta.IdCliente;
                boletaDB.Cliente = boleta.Cliente;
                Context.Entry(boletaDB.Cliente).State = System.Data.EntityState.Unchanged;

            }


            var DetallesEliminados = new List<DetalleBoleta>();

            foreach (var detalleBD in boletaDB.DetalleBoleta)
            {
                var eliminado = boleta.DetalleBoleta.Where(dp => dp.item == detalleBD.item).SingleOrDefault();

                if (eliminado == null)
                {
                    DetallesEliminados.Add(detalleBD);
                }
            }

            foreach (var detEliminado in DetallesEliminados)
            {
                var eliminar = boletaDB.DetalleBoleta.Where(dp => dp.item == detEliminado.item).SingleOrDefault();
                boletaDB.DetalleBoleta.Remove(eliminar);
            }

            foreach (var detalle in boleta.DetalleBoleta)
            {
                if (detalle.item == 0)
                {
                    Context.Entry(detalle.Producto).State = System.Data.EntityState.Unchanged;
                    boletaDB.DetalleBoleta.Add(detalle);
                }

                else
                {
                    var detalleDB = boletaDB.DetalleBoleta.Where(dp => dp.item == detalle.item).SingleOrDefault();
                    detalleDB.Cantidad = detalle.Cantidad;
                    detalleDB.Precio = detalle.Precio;

                    Context.Entry(detalleDB.Producto).State = System.Data.EntityState.Unchanged;
                    Context.Entry(detalleDB).State = System.Data.EntityState.Modified;
                }
            }

            Context.Entry(boletaDB).State = System.Data.EntityState.Modified;
            Context.SaveChanges();
        }

        public void removeBoleta(int id)
        {
            var boleta = getFromBoletaById(id);

            Context.Boleta.Remove(boleta);
            Context.SaveChanges();
        }
       
        public List<Boleta> getAllBoletaByNombreAndFechas(string nombre, DateTime? FInicio, DateTime? FFin)
        {
            var query = from p in Context.Boleta.Include("Cliente")
                        select p;

            if (nombre != null && nombre != "")
            {
                query = from c in query
                        where c.Cliente.Nombre.ToUpper().Contains(nombre.ToUpper()) ||
                        c.Cliente.Apellidos.ToUpper().Contains(nombre.ToUpper())
                        select c;
            }

            else if (FInicio.HasValue && FFin.HasValue)
            {
                query = from p in query
                        where p.Fecha >= FInicio && p.Fecha <= FFin
                        select p;
            }


            return query.ToList();
        }

        
    }
}
